#include "common.h"

#include "../client/cl_console.h"
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

jmp_buf abort_spot;

//FIXME: 有可能出现错误死循环
//一般错误
void com_error(const char * msg)
{
	con_log("[ERROR]: ");
	con_log(msg);
	con_log("\n");

	longjmp(abort_spot, 1);
}

//一般警告
void com_warning(const char * msg)
{
	con_log("[WARNING]: ");
	con_log(msg);
	con_log("\n");
}

//致命错误
void com_fatal(const char * msg)
{
	perror(msg);

	com_quit(1);
}

//日志记录
void com_log(const char * msg)
{
	con_log("[LOG]: ");
	con_log(msg);
	con_log("\n");
}

//内存管理
void * com_malloc(size_t size)
{
	void * new = malloc(size);

	if (new == NULL)
		com_fatal("com_malloc");

	return new;
}

char * com_strdup(const char * str)
{
	if (str == NULL)
		return NULL;

	char * new = strdup(str);

	if (new == NULL)
		com_fatal("com_strdup");

	return new;
}

void com_free(void * mem_ptr)
{
	free(mem_ptr);
}


int com_hexstr_to_int(const char * str)
{
	if (!str || !str[0])
		return -1;

	if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
		int i, n = 0;
		char digit;
		int len = strlen(str);

		for (i = 2; i < len; i++) {
			digit = tolower(str[i]);

			if (digit >= '0' && digit <= '9')
				digit -= '0';
			else if (digit >= 'a' && digit <= 'f')
				digit = digit - 'a' + 10;
			else
				return -1;

			n <<= 4;
			n += digit;
		}

		return n;
	}

	return -1;
}


